home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / crc.swg / 0006_32 Bit CRC.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  5KB  |  107 lines

  1. {
  2. > I was kind of hoping to be ushered toward a File name I could locate
  3. > which would do what I need.  (Produce 32 bit CRC's that are compatible
  4. > With PKZIP's output).
  5.  
  6.   I snagged this of this echo sometime ago.  It does CRC32
  7.  using only TP With the help of a precalculated table.
  8.  It does procduce CRC32 values that are the same as PKZIP and ARJ.
  9.  
  10. --------------------- Unit CRC32C.PAS 8<-----------------------
  11. { Modified from a version posted on the Pascal echo by Floor
  12.   A.C. Naaijkens (note introduction of a Constant and a
  13.   Function and making the Array a Constant outside of
  14.   crc32() which should improve speed a lot; further
  15.   references made to a C version in a File of Snippets from the
  16. (112 min left), (H)elp, More?   C Echo marked as "Copyright (C) 1986 Gary S. Brown" (mostly to
  17.   compare the large Arrays, which proved to be identical), and to
  18.   "File verification using CRC" by Mark R. Nelson in Dr. Dobbs'
  19.   Journal, May 1992.  The latter provided the final piece of
  20.   crucial information.  Use: 1) Create a LongInt Variable For the
  21.   CRC value; 2) Initialize this With CRCSeed; 3) Build the
  22.   CRC Byte-by-Byte With CRC32(); 4) Finish With CRCend()
  23.   (this was the part I found in Nelson).  The result is a CRC
  24.   value identical to that calculated by PKZip and ARJ.
  25. }
  26. Unit CRC32c;
  27. Interface
  28.   Const
  29.     CRCSeed = $ffffffff;
  30.     CRC32tab : Array[0..255] of LongInt = (
  31.       $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
  32.       $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
  33.       $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
  34.       $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
  35.       $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
  36.       $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
  37.       $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
  38.       $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
  39.       $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
  40.       $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
  41.       $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
  42.       $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
  43.       $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
  44.       $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
  45.       $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
  46.       $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
  47.       $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
  48.       $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
  49.       $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
  50.       $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
  51.       $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
  52.       $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
  53.       $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
  54.       $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
  55.       $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
  56.       $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
  57.       $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
  58.       $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
  59.       $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
  60.       $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
  61.       $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
  62.       $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
  63.       $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
  64.       $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
  65.       $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
  66.       $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
  67.       $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
  68.       $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
  69.       $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
  70.       $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
  71.       $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
  72.       $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
  73.       $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d  );
  74. Function CRC32(value: Byte; crc: LongInt) : LongInt;
  75. Function CRCend( crc : LongInt ) : LongInt ;
  76.  
  77. Implementation
  78.  
  79. Function  CRC32(value: Byte; crc: LongInt) : LongInt;
  80. begin
  81.   CRC32 := CRC32tab[Byte(crc xor LongInt(value))] xor
  82.            ((crc shr 8) and $00ffffff);
  83. end;
  84.  
  85. Function CRCend( crc : LongInt ): LongInt;
  86. begin
  87.   CRCend := (crc xor CRCSeed);
  88. end;
  89.  
  90. end.
  91.  
  92. {
  93. Now to use it...
  94.  
  95. With a LongInt Variable, say vCRC32, first seed it
  96.   vCRC32 := CRCSeed;
  97. Then go Byte-by-Byte thorugh to calculate:
  98.   For P := 1 to Size DO
  99.     vCRC32 := CRC32(Bytes[P], vCRC32);
  100.  
  101.   Then finish it off With CRCend
  102.  
  103.     vCRC32 := CRCend(vCRC32);
  104.  
  105.   You should be able to Write your own Dec2Hex Function =)
  106. }
  107.